home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / internet / cswsk110 / tinyftp.bas < prev    next >
Encoding:
BASIC Source File  |  1995-12-08  |  7.5 KB  |  293 lines

  1. Option Explicit
  2.  
  3. Function FTPCommand (CtlData As String) As Integer
  4.     On Error Resume Next
  5.     
  6.     Debug.Print "> "; CtlData
  7.     CtlData = CtlData & Chr$(13) & Chr$(10)
  8.     Client.Socket1.SendLen = Len(CtlData)
  9.     Client.Socket1.SendData = CtlData
  10.  
  11.     If Err <> 0 Then
  12.         FTPCommand = False
  13.     Else
  14.         FTPCommand = True
  15.     End If
  16.  
  17. End Function
  18.  
  19. Function FTPConnect (HostName As String)
  20.     Dim CtlData As String, Reply As Integer
  21.  
  22.     FTPConnect = False
  23.     If HostName = "" Then Exit Function
  24.  
  25.     Client.Socket1.AddressFamily = AF_INET
  26.     Client.Socket1.Protocol = IPPROTO_IP
  27.     Client.Socket1.Type = SOCK_STREAM
  28.     Client.Socket1.RemotePort = IPPORT_FTP
  29.     Client.Socket1.HostName = HostName
  30.     Client.Socket1.Binary = False
  31.     Client.Socket1.BufferSize = 1024
  32.     Client.Socket1.Blocking = True
  33.  
  34.     On Error Resume Next
  35.     Client.Socket1.Action = SOCKET_CONNECT
  36.     If Err Then
  37.         MsgBox Error$
  38.         Exit Function
  39.     End If
  40.  
  41.     Reply = FTPResult(CtlData)
  42.     
  43.     If Reply = 220 Then
  44.         FTPConnect = True
  45.     Else
  46.         Client.Socket1.Action = SOCKET_CLOSE
  47.     End If
  48.  
  49. End Function
  50.  
  51. Sub FTPGetDirectory ()
  52.     Dim CtlData As String
  53.     
  54.     If Not FTPCommand("PWD") Then Exit Sub
  55.     If FTPResult(CtlData) <> 257 Then Exit Sub
  56.  
  57.     CtlData = Mid$(CtlData, 2, InStr(CtlData, " ") - 3)
  58.     Client.RemotePath.Caption = CtlData
  59. End Sub
  60.  
  61. Function FTPGetFile (RemoteFile As String, LocalFile As String)
  62.     Dim CtlData As String, Buffer As String
  63.     Dim Result As Integer
  64.  
  65.     FTPGetFile = False
  66.  
  67.     If RemoteFile = "" Or LocalFile = "" Then Exit Function
  68.     If Not FTPListen() Then Exit Function
  69.     If Not FTPCommand("RETR " & RemoteFile) Then Exit Function
  70.     
  71.     If FTPResult(CtlData) <> 150 Then
  72.         Client.Socket2.Action = SOCKET_CLOSE
  73.         Exit Function
  74.     End If
  75.  
  76.     Client.Socket2.Action = SOCKET_ACCEPT
  77.     On Error Resume Next
  78.     
  79.     Open LocalFile For Binary As #1
  80.     If Err Then
  81.         MsgBox Error$
  82.         Client.Socket2.Action = SOCKET_CLOSE
  83.         Exit Function
  84.     End If
  85.  
  86.     FTPGetFile = True
  87.  
  88.     Do
  89.         Client.Socket2.RecvLen = 4096
  90.         Buffer = Client.Socket2.RecvData
  91.         If Err Then
  92.             FTPGetFile = False
  93.             MsgBox Error$
  94.             Exit Do
  95.         End If
  96.         If Client.Socket2.RecvLen = 0 Then Exit Do
  97.         Put #1, , Buffer
  98.         DoEvents
  99.     Loop
  100.  
  101.     Close #1
  102.     Client.Socket2.Action = SOCKET_CLOSE
  103.     Result = FTPResult(CtlData)
  104. End Function
  105.  
  106. Function FTPListen ()
  107.     Dim Port As Integer, HexPort As String, Address As String
  108.     Dim Reply As Integer, CtlData As String
  109.     Dim I As Integer, P As Integer
  110.  
  111.     FTPListen = False
  112.     
  113.     Client.Socket2.AddressFamily = AF_INET
  114.     Client.Socket2.Binary = True
  115.     Client.Socket2.Blocking = True
  116.     Client.Socket2.BufferSize = 4096
  117.     Client.Socket2.HostAddress = INADDR_ANY
  118.     Client.Socket2.LocalPort = IPPORT_ANY
  119.     Client.Socket2.Protocol = IPPROTO_TCP
  120.     Client.Socket2.Timeout = 0
  121.     Client.Socket2.Type = SOCK_STREAM
  122.     Client.Socket2.Action = SOCKET_LISTEN
  123.  
  124.     '
  125.     ' Construct a PORT command string that consists of the
  126.     ' local IP address and port number broken down into six
  127.     ' bytes seperated by commas
  128.     '
  129.     Port = Client.Socket2.LocalPort
  130.     Address = Client.Socket2.LocalAddress
  131.  
  132.     '
  133.     ' The IP address part is easy because it's already in
  134.     ' dot notation; just substitute commas for the dots
  135.     '
  136.     For I = 1 To 3
  137.         P = InStr(Address, ".")
  138.         If P <> 0 Then Mid$(Address$, P, 1) = ","
  139.     Next I
  140.     
  141.     '
  142.     ' Split the local port number into high and low bytes by
  143.     ' converting it to hex, pulling it apart, and then converting
  144.     ' the pieces back to decimal
  145.     '
  146.     HexPort = Hex$(Port)
  147.     If Len(HexPort) = 3 Then HexPort = "0" + HexPort
  148.     CtlData = "PORT " & Address & "," & (Val("&h" + Left$(HexPort, 2))) & "," & (Port And &HFF)
  149.     
  150.     '
  151.     ' Send the PORT command to the server so that it knows
  152.     ' where we are
  153.     '
  154.     If Not FTPCommand(CtlData) Then GoTo OpenFailed
  155.     If FTPResult(CtlData) <> 200 Then GoTo OpenFailed
  156.     
  157.     '
  158.     ' Select the file type for transfer
  159.     '
  160.     If Client.BinaryTransfer.Value = 1 Then
  161.         CtlData = "TYPE I"
  162.     Else
  163.         CtlData = "TYPE A"
  164.     End If
  165.     
  166.     If Not FTPCommand(CtlData) Then GoTo OpenFailed
  167.     If FTPResult(CtlData) <> 200 Then GoTo OpenFailed
  168.     
  169.     FTPListen = True
  170.     Exit Function
  171.  
  172. OpenFailed:
  173.     If Client.Socket2.Listening Then Client.Socket2.Action = SOCKET_CLOSE
  174.     Exit Function
  175. End Function
  176.  
  177. Function FTPLogin (Username As String, Password As String) As Integer
  178.     Dim CtlData As String, Reply As Integer
  179.     Dim Counter As Integer
  180.     
  181.     FTPLogin = False
  182.  
  183.     If Client.Socket1.IsReadable Then
  184.         Reply = FTPResult(CtlData)
  185.     End If
  186.  
  187.     While Reply = 220 And Client.Socket1.IsReadable
  188.         Reply = FTPResult(CtlData)
  189.     Wend
  190.  
  191.     CtlData = "USER " & Username
  192.     If Not FTPCommand(CtlData) Then Exit Function
  193.     Reply = FTPResult(CtlData)
  194.  
  195.     If Reply = 331 Then
  196.         CtlData = "PASS " & Password
  197.         If Not FTPCommand(CtlData) Then Exit Function
  198.         Reply = FTPResult(CtlData)
  199.     End If
  200.     
  201.     While Reply = 230 And Client.Socket1.IsReadable
  202.         Reply = FTPResult(CtlData)
  203.     Wend
  204.  
  205.     If Reply = 230 Then
  206.         FTPLogin = True
  207.     Else
  208.         MsgBox "Invalid user name or password"
  209.     End If
  210.  
  211. End Function
  212.  
  213. Function FTPPutFile (LocalFile As String, RemoteFile As String)
  214.     Dim CtlData As String, Buffer As String * 4096
  215.     Dim Result As Integer, Size As Long
  216.  
  217.     FTPPutFile = False
  218.  
  219.     If RemoteFile = "" Or LocalFile = "" Then Exit Function
  220.     If Not FTPListen() Then Exit Function
  221.     If Not FTPCommand("STOR " & RemoteFile) Then Exit Function
  222.     
  223.     If FTPResult(CtlData) <> 150 Then
  224.         Client.Socket2.Action = SOCKET_ABORT
  225.         Exit Function
  226.     End If
  227.  
  228.     Client.Socket2.Action = SOCKET_ACCEPT
  229.     On Error Resume Next
  230.     
  231.     Size = FileLen(LocalFile)
  232.     If Err Then
  233.         Client.Socket2.Action = SOCKET_CLOSE
  234.         MsgBox Error$
  235.         Exit Function
  236.     End If
  237.     
  238.     Open LocalFile For Binary As #1
  239.  
  240.     If Err Then
  241.         Client.Socket2.Action = SOCKET_CLOSE
  242.         MsgBox Error$
  243.         Exit Function
  244.     End If
  245.  
  246.     FTPPutFile = True
  247.  
  248.     Do
  249.         Get #1, , Buffer
  250.         If Size < Len(Buffer) Then
  251.             Client.Socket2.SendLen = Size
  252.             Size = 0
  253.         Else
  254.             Client.Socket2.SendLen = Len(Buffer)
  255.             Size = Size - Len(Buffer)
  256.         End If
  257.         Client.Socket2.SendData = Buffer
  258.         If Err > 0 Then
  259.             FTPPutFile = False
  260.             MsgBox Error$
  261.             Exit Do
  262.         End If
  263.         If Size = 0 Then Exit Do
  264.         DoEvents
  265.     Loop
  266.  
  267.     Close #1
  268.     Client.Socket2.Action = SOCKET_CLOSE
  269.     Result = FTPResult(CtlData)
  270. End Function
  271.  
  272. Function FTPResult (CtlData As String) As Integer
  273.     Dim SockData As String, Reply As Integer
  274.  
  275.     Client.Socket1.RecvLen = 255
  276.     SockData = Client.Socket1.RecvData
  277.     Debug.Print "< "; SockData
  278.  
  279.     Reply = Val(Left$(SockData, 3))
  280.     If Mid$(SockData, 4, 1) = "-" Then
  281.         Do
  282.             Client.Socket1.RecvLen = 255
  283.             SockData = Client.Socket1.RecvData
  284.             If Val(Left$(SockData, 3)) = Reply Then Exit Do
  285.             Debug.Print "< "; SockData
  286.         Loop
  287.     End If
  288.     CtlData = Right$(SockData, Len(SockData) - InStr(SockData, " "))
  289.     
  290.     FTPResult = Reply
  291. End Function
  292.  
  293.